package com.demo.wrapper.interfaces;

import com.demo.wrapper.function.IGetter;
import com.demo.wrapper.pojo.Order;

/**
 * 支持lambda的聚合拼接接口
 *
 * @param <Wrapper>    条件拼接类，需继承Limit接口
 * @param <AggWrapper> 聚合拼接类，需继承Agg接口
 * @param <DO>         文档实体类
 * @author arthur_zhou
 */
public interface IEsLambdaAggWrapper<AggWrapper extends IEsLambdaAggWrapper<AggWrapper, DO, Wrapper>, DO, Wrapper extends IEsLimitWrapper<Wrapper, AggWrapper>>
        extends IEsAggWrapper<AggWrapper, Wrapper>, ILambdaWrapper<AggWrapper, DO> {

    /**
     * 分组统计
     * column,count(*) group by column
     *
     * @param name   聚合名
     * @param getter get方法
     * @return this
     */
    default AggWrapper terms(String name, IGetter<DO> getter) {
        return terms(name, findField(getter));
    }

    /**
     * 分组统计
     * column,count(*) group by column
     *
     * @param name   聚合名
     * @param getter get方法
     * @param size   返回大小
     * @return this
     */
    default AggWrapper terms(String name, IGetter<DO> getter, int size) {
        return terms(name, findField(getter), size);
    }

    /**
     * 分组统计
     * column,count(*) group by column
     *
     * @param name   聚合名
     * @param getter get方法
     * @param orders 排序
     * @return this
     */
    default AggWrapper terms(String name, IGetter<DO> getter, Order... orders) {
        return terms(name, findField(getter), orders);
    }

    /**
     * 分组统计
     * column,count(*) group by column
     *
     * @param name   聚合名
     * @param getter get方法
     * @param size   返回大小
     * @param orders 排序
     * @return this
     */
    default AggWrapper terms(String name, IGetter<DO> getter, int size, Order... orders) {
        return terms(name, findField(getter), size, orders);
    }

    /**
     * 统计
     * count(column)
     *
     * @param name   聚合名
     * @param getter get方法
     * @return this
     */
    default AggWrapper count(String name, IGetter<DO> getter) {
        return count(name, findField(getter));
    }

    /**
     * 去重统计
     * count(distinct column)
     *
     * @param name   聚合名
     * @param getter get方法
     * @return this
     */
    default AggWrapper cardinality(String name, IGetter<DO> getter) {
        return cardinality(name, findField(getter));
    }

    /**
     * 平均值
     * avg(column)
     *
     * @param name   聚合名
     * @param getter get方法
     * @return this
     */
    default AggWrapper avg(String name, IGetter<DO> getter) {
        return avg(name, findField(getter));
    }

    /**
     * 值相加
     * sum(column)
     *
     * @param name   聚合名
     * @param getter get方法
     * @return this
     */
    default AggWrapper sum(String name, IGetter<DO> getter) {
        return sum(name, findField(getter));
    }

    /**
     * 最大值
     * min(column)
     *
     * @param name   聚合名
     * @param getter get方法
     * @return this
     */
    default AggWrapper max(String name, IGetter<DO> getter) {
        return max(name, findField(getter));
    }

    /**
     * 最小值
     * min(column)
     *
     * @param name   聚合名
     * @param getter get方法
     * @return this
     */
    default AggWrapper min(String name, IGetter<DO> getter) {
        return min(name, findField(getter));
    }

    /**
     * 详细信息
     * count(column),avg(column),sum(column),min(column),min(column)
     *
     * @param name   聚合名
     * @param getter get方法
     * @return this
     */
    default AggWrapper stats(String name, IGetter<DO> getter) {
        return stats(name, findField(getter));
    }

}
